package com.thinkit.bigdata.web.service.impl.sec;

import com.thinkit.bigdata.core.util.DateFormatUtil;
import com.thinkit.bigdata.web.dao.sec.LoginErrorMapper;
import com.thinkit.bigdata.web.dao.sys.SysConfigMapper;
import com.thinkit.bigdata.web.model.result.Constants;
import com.thinkit.bigdata.web.model.sec.User;
import com.thinkit.bigdata.web.model.sys.SysConfig;
import com.thinkit.bigdata.web.service.sec.LoginErrorService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * Created by lihongli on 2019/1/28
 */
@Service
public class LoginErrorServiceImpl implements LoginErrorService {

    @Resource
    private LoginErrorMapper loginErrorMapper;

    @Resource
    private SysConfigMapper sysConfigMapper;

    @Override
    public String updateLoginErrorInfo(String username) {
        // 用来标记返回结果
        String message = "账号或密码错误";
        // 根据用户名查询用户是否存在
        List<User> userList = loginErrorMapper.selectByUserName(username);
        if (userList.isEmpty()) {
            // 如果不存在 返回-1标记用户名错误 不需要更新用户登录错误信息
            return message;
        }
        // 最大登录失败次数
        Integer times = selectMaxLoginErrorTimes();
        // 如果用户存在 判断目前已经登录错误的次数
        User user = userList.get(0);
        if(user.getIsdelete() == 1){
            return "账号已被锁定，请联系管理员";
        }
        // 数据库存储的错误信息
        String errorday = user.getErrorday();
        int errornum = user.getErrornum();
        // 目前的错误信息
        String now = DateFormatUtil.dateToString(new Date(), "yyyy-MM-dd");
        // 判断数据库中错误时间是不是今天 如果不是 错误次数重新计算
        if (null == errorday || !errorday.equals(now)) {
            errornum = 0;
        }
        // 如果当前已经有错误信息 且错误次数已以达到设定值
        if (errornum + 1 >= times) {
            user.setErrorday(now);
            user.setErrornum(errornum + 1);
            // 0 正常 1锁定 2过期 3停用  （note on 2019/05/09：目前状态 0正常 1锁定 2过期 3停用 ）
            user.setIsdelete(1);
            message = "错误次数过多，账号已锁定";
        } else {
            // 错误次数还没有达到
            user.setErrorday(now);
            user.setErrornum(errornum + 1);
            message = "账号或密码错误，您今天还有" + (times - errornum -1) + "次登录机会";
        }
        // 更新错误信息
        loginErrorMapper.updateLoginErrorInfo(user);
        // 返回当前错误次数
        return message;
    }

    // 查询最大登录失败次数
    private Integer selectMaxLoginErrorTimes() {
        // 设定初始值
        Integer times = 5;
        SysConfig config = sysConfigMapper.selectByPrimaryKey(Constants.LOGIN_MAX_FAILURE);
        try {
            // 对配置的值进行判断处理
            times = Integer.valueOf(config.getValue().trim());
        } catch (NumberFormatException e) {
            // 非数字格式转换报错 不处理 直接使用初始值
        }
        return times;
    }
}
